﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using SisVenda.Business;
using SisVenda.Data;
using System.Data;
using System.Collections;
using System.Reflection;
using Froggy.Data;

namespace SisVenda.Web.Restrito.Fn
{
    [System.ComponentModel.DataObject(true)]
    public class CadastroFucionarioFn
    {
        private int end_idI = 0;
        #region Select
        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
        public DataTable ObterCargo()
        {
            #region SQL
            string sql = @" SELECT * FROM [BD_SisVenda].[dbo].[Cargo]";

            #endregion
            DbCommandUtil db = new DbCommandUtil(sql);
            return db.GetDataTable();
        }

        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
        public DataTable ObterCargoid(int idCargo)
        {
            #region SQL
            string sql = @" SELECT * FROM [BD_SisVenda].[dbo].[Cargo]
                            WHERE IdCargo = @idCargo";

            #endregion
            DbCommandUtil db = new DbCommandUtil(sql);
            db.AddParameter("@idCargo", DbType.Int32, idCargo);
            return db.GetDataTable();
        }

        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
        public DataTable ObterFuncionarioID(int idFuncionario)
        {
            #region SQL

            string sql = @"SELECT * 
                           FROMPessoap
                           INNER JOIN Funcionario f on f.Pessoa_IdPessoa = p.IdPessoa
                           INNER JOIN Cargo c on c.IdCargo = f.Cargo_IdCargo
                           INNER JOIN Endereco e on e.IdEndereco = p.Endereco_IdEndereco
                           INNER JOIN Cidade ci on ci.IdCidade = e.Cidade_IdCidade
                           INNER JOIN Uf u on u.UfNome = ci.Uf_UfNome
                           WHERE p.IdPessoa = @idFuncionario";

            #endregion
            DbCommandUtil db = new DbCommandUtil(sql);
            db.AddParameter("@idFuncionario", DbType.Int32, idFuncionario);
            return db.GetDataTable();
        }

        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Select)]
        public DataTable ObterFuncionario(string nome,string cpf)
        {
            #region SQL

            string sql = @"SELECT * 
                           FROM Pessoa p
                           INNER JOIN Funcionario f on f.Pessoa_IdPessoa = p.IdPessoa
                           INNER JOIN Cargo c on c.IdCargo = f.Cargo_IdCargo
                           INNER JOIN Endereco e on e.IdEndereco = p.Endereco_IdEndereco
                           INNER JOIN Cidade ci on ci.IdCidade = e.Cidade_IdCidade
                           INNER JOIN Uf u on u.Ufnome = ci.Uf_UfNome
                           WHERE p.Nome LIKE @nome or p.CPF LIKE @cpf
                         ";

            #endregion
            DbCommandUtil db = new DbCommandUtil(sql);
            db.AddParameter("@nome", DbType.String,"%"+nome+"%");
            db.AddParameter("@cpf", DbType.String, "%"+cpf+"%");
            return db.GetDataTable();
        }

        #endregion

        #region Endereco_Insert_Update

        private Boolean InsertEndereco(string descricao, string bairro, int numero, string cep, int idCidade)
        {
            EnderecoBo enderecos = new EnderecoBo();
            Endereco endereco = new Endereco();

            endereco.Rua = descricao;
            endereco.Bairro = bairro;
            endereco.Numero = numero;
            endereco.Cep = cep;
            endereco.Cidade_IdCidade = idCidade;

            enderecos.Add(endereco);

            try
            {
                enderecos.SaveChanges();

                end_idI = endereco.IdEndereco;
                endereco = null;
                enderecos = null;
                return true;

            }
            catch
            {
                endereco = null;
                enderecos = null;
                return false;
            }

        }

        public Boolean UpdateEndereco(int idEndereco,string descricao, string bairro, int numero, string cep, int idCidade)
        {
            EnderecoBo enderecos = new EnderecoBo();
            Endereco endereco = new Endereco();

            endereco = enderecos.Find(end => end.IdEndereco == idCidade).First<Endereco>();

            endereco.Rua = descricao;
            endereco.Bairro = bairro;
            endereco.Numero = numero;
            endereco.Cep = cep;
            endereco.Cidade_IdCidade = idCidade;

            enderecos.Update(endereco);

            try
            {
                enderecos.SaveChanges();
                endereco = null;
                enderecos = null;
                return true;
            }
            catch
            {
                endereco = null;
                enderecos = null;
                return false;
            }

        }

        #endregion

        #region Funcionario_Insert_Update
        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Insert)]
        public Boolean InsertPessoa(string nome, string cpf, string rg, string cnpj, string inscricaoEstadual, string sexo, string tipoPessoa, DateTime dataNascimento,
                                    string estadoCivil, string telefone, string celular, string fax, string email, string descricao, string bairro, int numero, string cep, int idCidade,
                                    int idCargo)
        {
            PessoaBo pessoas = new PessoaBo();
            Pessoa pessoa = new Pessoa();
            FuncionarioBo funcionarios = new FuncionarioBo();
            Funcionario funcionario = new Funcionario();
            Guid g = new Guid("0E984725-C51C-4BF4-9960-E1C80E27ABA0");

            InsertEndereco(descricao, bairro, numero, cep, idCidade);

            pessoa.Nome = nome;
            pessoa.CPF = cpf;
            pessoa.RG = rg;
            pessoa.CNPJ = cnpj;
            pessoa.InscricaoEstadual = inscricaoEstadual;
            pessoa.Sexo = sexo;
            pessoa.TipoPessoa = tipoPessoa;
            pessoa.DataNascimento = dataNascimento.Date;
            pessoa.EstadoCivil = estadoCivil;
            pessoa.Telefone = telefone;
            pessoa.Celular = celular;
            pessoa.Fax = fax;
            pessoa.Email = email;
            pessoa.Endereco_IdEndereco = end_idI;
            pessoa.TipoPessoa = "FISICA";
            pessoas.Add(pessoa);
            try
            {
                
                pessoas.SaveChanges();
                funcionario.Cargo_IdCargo = idCargo;
                funcionario.Pessoa_IdPessoa = pessoa.IdPessoa;
                funcionario.Situacao_IdSituacao=1;
                funcionarios.Add(funcionario);
                funcionarios.SaveChanges();
                end_idI = 0;
                pessoas = null; pessoa = null; funcionarios = null; funcionario = null;
                return true;
            }
            catch { pessoas = null; pessoa = null; funcionarios = null; ;return false; }

        }

        [System.ComponentModel.DataObjectMethod(System.ComponentModel.DataObjectMethodType.Update)]
        public Boolean UpdatePessoa(int idFuncionario,int idEndereco,string nome, string cpf, string rg, string cnpj, string inscricaoEstadual, string sexo, string tipoPessoa, DateTime dataNascimento,
                                    string estadoCivil, string telefone, string celular, string fax, string email, string descricao, string bairro, int numero, string cep, int idCidade, 
                                    int idCargo)
        {
            PessoaBo pessoas = new PessoaBo();
            Pessoa pessoa = new Pessoa();
            FuncionarioBo funcionarios = new FuncionarioBo();
            Funcionario funcionario = new Funcionario();

            UpdateEndereco(idEndereco, descricao, bairro, numero , cep, idCidade);
            pessoa = pessoas.Find(pes => pes.IdPessoa  == idFuncionario).First<Pessoa>();
            funcionario = funcionarios.Find(fun => fun.Pessoa_IdPessoa == pessoa.IdPessoa).First<Funcionario>();

            pessoa.Nome = nome;
            pessoa.CPF = cpf;
            pessoa.RG = rg;
            pessoa.CNPJ = cnpj;
            pessoa.InscricaoEstadual = inscricaoEstadual;
            pessoa.Sexo = sexo;
            pessoa.TipoPessoa = tipoPessoa;
            pessoa.DataNascimento = dataNascimento.Date;
            pessoa.EstadoCivil = estadoCivil;
            pessoa.Telefone = telefone;
            pessoa.Celular = celular;
            pessoa.Fax = fax;
            pessoa.Email = email;
            pessoa.Endereco_IdEndereco = end_idI;
            pessoa.TipoPessoa = "F";
            pessoas.Update(pessoa);
            try
            {
                pessoas.SaveChanges();
                funcionario.Cargo_IdCargo = idCargo;
                funcionario.Situacao_IdSituacao = 1;
                funcionarios.Update(funcionario);
                funcionarios.SaveChanges();
                end_idI = 0;
                pessoas = null; pessoa = null; funcionarios = null; funcionario = null;
                return true;
            }
            catch { pessoas = null; pessoa = null; funcionarios = null; ;return false; }
        }

        #endregion
    }

}